﻿using System;
using System.Collections.Generic;
using System.Text;
using TTEditor.CustomAttribute;

namespace TTEditor.Resource
{

    //转换之后的是什么东西？不需要知道，转换之后有错误输出到output
    //转换之后的资源加载不通过这个机制，找
    //然后加一个错误收集机制就好了
    public interface IConverter
    {
        //"扩展名，包括".",支持多层扩展名
        [CustomAttribute.ItemEditorStyle(ItemEditorStyle.Style.Hide)]
        string extname
        {
            get;
        }
        //检查一个资源是否需要被转换（并非所有的资源都需要被转换，有些资源可以直接加载，有些不行，要转换为引擎的格式）
        bool NeedConvert(byte[] srcdata,AssetMetaData data);
        void Convert(byte[] srcdata,AssetMetaData data);
        //Option是你自己的事儿

        [CustomAttribute.ItemEditorStyle(ItemEditorStyle.Style.Hide)]
        bool HaveGUIExt
        {
            get;
        }
        void OnGUI();

    }
    public static class ConverterMgr
    {
        static Dictionary<string, IConverter> importers = new Dictionary<string, IConverter>();
        public static void AddResourceConverter(IConverter importer)
        {
            if (importer.extname[0] != '.')
                throw new Exception("file extname must start with .");
            var extnames = importer.extname.ToLower().Split('|');
            foreach(var e in extnames)
            {
                importers.Add(e, importer);
            }
        }

        public static IConverter GetConverterByFileName(string filename)
        {
            var i = filename.IndexOf('.');
            var ext = filename.Substring(i).ToLower();
            while(true)
            {
                if (importers.ContainsKey(ext))
                    return importers[ext];
                var ni = ext.IndexOf('.', 2);
                if (ni < 0)
                    return null;
                ext = ext.Substring(ni);
            }
        }
        public static void Convert(IConverter converter,string srcfile,string destfile,bool bForce=false)
        {
            AssetMetaData data = new AssetMetaData();
            if (!bForce)//非强制模式，读取meta，比对是否需要转换
            {
                data.Open(destfile);
            }
            else
            {//强制模式，不初始化Meta，则一定触发转换

            }
            var srcdata = System.IO.File.ReadAllBytes(srcfile);

            if (converter.NeedConvert(srcdata, data))
            {
                converter.Convert(srcdata, data);
                data.Save(destfile);
            }
        }
    }
}
